/*
 * File    : TRTrackerServerStatsImpl.java
 * Created : 31-Oct-2003
 * By      : parg
 * 
 * Azureus - a Java Bittorrent client
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details ( see the LICENSE file ).
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.gudy.azureus2.core3.tracker.server.impl;

/**
 * @author parg
 */

import org.gudy.azureus2.core3.tracker.server.TRTrackerServerTorrentStats;

public class TRTrackerServerTorrentStatsImpl implements TRTrackerServerTorrentStats {
    private TRTrackerServerTorrentImpl torrent;
    private long announce_count;
    private long scrape_count;
    private long completed_count;

    private long uploaded;
    private long downloaded;
    private long left;

    private long biased_uploaded;
    private long biased_downloaded;

    private long bytes_in;
    private long bytes_out;

    protected TRTrackerServerTorrentStatsImpl(TRTrackerServerTorrentImpl _torrent) {
        torrent = _torrent;
    }

    protected void addAnnounce(long ul_diff, long dl_diff, long le_diff, boolean biased_peer) {
        announce_count++;

        uploaded += ul_diff < 0 ? 0 : ul_diff; // should always be +ve
        downloaded += dl_diff < 0 ? 0 : dl_diff;
        left += le_diff; // can be +ve at start (0->x) then neg after

        if (left < 0) {

            left = 0;
        }

        if (biased_peer) {

            biased_uploaded += ul_diff < 0 ? 0 : ul_diff; // should always be +ve
            biased_downloaded += dl_diff < 0 ? 0 : dl_diff;
        }
    }

    protected void removeLeft(long _left) {
        left -= _left;

        if (left < 0) {

            left = 0;
        }
    }

    public long getAnnounceCount() {
        return (announce_count);
    }

    protected void addScrape() {
        scrape_count++;
    }

    public long getScrapeCount() {
        return (scrape_count);
    }

    protected void addCompleted() {
        completed_count++;
    }

    public long getCompletedCount() {
        return (completed_count);
    }

    public long getUploaded() {
        return (uploaded);
    }

    public long getDownloaded() {
        return (downloaded);
    }

    public long getBiasedUploaded() {
        return (biased_uploaded);
    }

    public long getBiasedDownloaded() {
        return (biased_downloaded);
    }

    public long getAmountLeft() {
        return (left);
    }

    protected void addXferStats(int in, int out) {
        bytes_in += in;
        bytes_out += out;
    }

    public long getBytesIn() {
        return (bytes_in);
    }

    public long getBytesOut() {
        return (bytes_out);
    }

    public int getSeedCount() {
        return (torrent.getSeedCount());
    }

    public int getLeecherCount() {
        return (torrent.getLeecherCount());
    }

    public int getQueuedCount() {
        return (torrent.getQueuedCount());
    }

    public int getBadNATPeerCount() {
        return (torrent.getBadNATPeerCount());
    }

    public String getString() {
        return ("an=" + announce_count + ",sc=" + scrape_count + ",co=" + completed_count + ",le=" + getLeecherCount() + ",se=" + getSeedCount()
                + ",q=" + getQueuedCount() + ",bi=" + bytes_in + ",bo=" + bytes_out);
    }
}
